import Taro from '@tarojs/taro'
import { SYSTEM_INFO_KEY } from '../actions'
import { numDiv, numMulti } from './math'
/**
 * 提示与加载工具类
 */
export default class Tips {
  static isLoading = false

  /**
   * 信息提示
   */
  static toast(title: string = '服务器繁忙，请稍后再试', onHide?: () => void) {
    Taro.showToast({
      title: title,
      icon: 'none',
      mask: true,
      duration: 1500,
    })
    // 隐藏结束回调
    if (onHide) {
      setTimeout(() => {
        onHide()
      }, 500)
    }
  }
  /**
   * 弹出加载提示
   */
  static loading(title = '加载中', force = false) {
    if (this.isLoading && !force) {
      return
    }
    this.isLoading = true
    if (Taro.showLoading) {
      Taro.showLoading({
        title: title,
        mask: true,
      })
    } else {
      Taro.showNavigationBarLoading()
    }
  }

  /**
   * 加载完毕
   */
  static loaded() {
    let duration = 0
    if (this.isLoading) {
      this.isLoading = false
      if (Taro.hideLoading) {
        Taro.hideLoading()
      } else {
        Taro.hideNavigationBarLoading()
      }
      duration = 500
    }
    // 隐藏动画大约500ms，避免后面直接toast时的显示bug
    return new Promise((resolve) => setTimeout(resolve, duration))
  }

  /**
   * 弹出提示框
   */
  static success(title, duration = 1500) {
    Taro.showToast({
      title: title,
      icon: 'success',
      mask: true,
      duration: duration,
    })
    if (duration > 0) {
      return new Promise((resolve) => setTimeout(resolve, duration))
    }
  }

  /**
   * 店铺打烊提醒框
   */
  static showClosedStore() {
    Taro.showModal({
      content: '店铺已打烊ZzZi，10:00-18:00营业时间再来吧',
      showCancel: false,
      confirmText: '我知道了',
      success: (res) => {
        console.log(res)
        console.log('ok')
      },
    })
  }

  /**
   * 模态框
   */
  static showModal(option) {
    // wx.showModal({
    //   title: '提示',
    //   content: '这是一个模态弹窗',
    //   success (res) {
    //     if (res.confirm) {
    //       console.log('用户点击确定')
    //     } else if (res.cancel) {
    //       console.log('用户点击取消')
    //     }
    //   }
    // })
    Taro.showModal(option)
  }
  /**
   * ? route参数计算
   */
  static paramsInit(params: object | undefined): string {
    let str: string = '?'
    for (const key in params) {
      if (typeof params[key] === 'string') {
        str += `${key}=${params[key]}&`
      } else {
        str += `${key}=${JSON.stringify(params[key])}&`
      }
    }
    return str
  }
  /**
   * ? 获取路由参数
   */
  static getRouteParams = () => Taro.getCurrentInstance()?.router?.params || {}

  /**
   *  TODO 跳转页面
   */
  static navigateTo(url: string, params?: object | undefined) {
    url = params ? url + Tips.paramsInit(params) : url
    // ! 小程序 页面栈限制
    if (Taro.getCurrentPages().length > 8) {
      return Taro.redirectTo({ url })
    }
    return Taro.navigateTo({ url })
  }

  /**
   *  TODO 暴力-跳转页面
   */
  static reLaunch(url: string, params?: object | undefined) {
    url = params ? url + Tips.paramsInit(params) : url
    return Taro.reLaunch({ url })
  }

  /**
   * TODO 返回上一页
   */
  static navigateBack() {
    Taro.navigateBack()
  }

  /**
   * TODO 跳转tabbar页面
   */
  static switchTab(url: string, params?: object | undefined) {
    url = params ? url + Tips.paramsInit(params) : url
    return Taro.switchTab({ url })
  }

  /**
   * TODO 重定向页面
   */
  static redirectTo(url: string) {
    Taro.redirectTo({ url })
  }

  /**
   * 隐藏‘回到首页’按钮
   */
  static hideHomeBtn() {
    Taro.hideHomeButton()
  }

  /**
   * 设置导航栏标题
   */
  static setNavigationBarTitle(title: string) {
    Taro.setNavigationBarTitle({ title })
  }

  static torageData = {}
  /**
   * 设置缓存
   */
  static setStorageSync(key: string, val: any) {
    Tips.torageData[key] = val
    Taro.setStorageSync(key, val)
  }

  /**
   * 获取缓存
   */
  static getStorageSync(key: string) {
    if (!Tips.torageData[key]) {
      Tips.torageData[key] = Taro.getStorageSync(key)
    }
    return Tips.torageData[key]
  }

  /**
   * 清除缓存
   */
  static removeStorageSync(key: string) {
    Tips.torageData[key] = null
    Taro.removeStorageSync(key)
  }
  /**
   * 提示 页面需要引入taro-ui    <AtMessage />
   */
  static atMessage(option) {
    const str = '服务器繁忙，请稍后再试'
    return Taro.atMessage({
      message:
        typeof option === 'string' ? option || str : option?.message || str,
      type: option?.type || 'success',
    })
  }
  /**
   * 路径 -> 参数 ( 一维码/二维码模式 )
   * @param url {url}
   */
  static codeUrlToParams = (url) => {
    const obj = {}
    if (url.indexOf('?') !== -1) {
      const string = url.substr(url.indexOf('?') + 1)
      const strs = string.split('&')
      if (strs.length === 1) {
        let tempObj = strs[0].substr(strs[0].indexOf('c'))
        let tempStr = tempObj.split('=')
        obj[tempStr[0]] = decodeURI(tempStr[1])
      } else {
        for (let i = 0; i < strs.length; i++) {
          let tempArr = strs[i].split('=')
          obj[tempArr[0]] = decodeURI(tempArr[1])
        }
      }
    }
    return obj
  }
  // RPX-TO-PX
  static RpxToPx = (rpx: number): number => {
    const System_info = Tips.getStorageSync(SYSTEM_INFO_KEY)
    return (rpx / 750) * System_info.windowWidth
  }
  /**
   * 查找小程序的dom 记得在生命周期中延时1s 调用后 .exec( (res)=>{  } )
   * @param className 类名/id名
   */
  static querySelectorDom(className) {
    const query = Taro.createSelectorQuery()
      .selectAll(className)
      .boundingClientRect()
    return query
  }
  /**
   * 存进剪辑版 ( 点击复制功能 )
   */
  static setClipboardData(str = '', callBack = () => {}) {
    Taro.setClipboardData({ data: str, success: callBack })
  }
  /**
   * 处理时间 dateFormat("YYYY-mm-dd HH:MM", date)
   * @param fmt
   * @param date
   */
  static dateFormat(fmt, date) {
    let ret
    const opt = {
      'Y+': date.getFullYear().toString(), // 年
      'm+': (date.getMonth() + 1).toString(), // 月
      'd+': date.getDate().toString(), // 日
      'H+': date.getHours().toString(), // 时
      'M+': date.getMinutes().toString(), // 分
      'S+': date.getSeconds().toString(), // 秒
      // 有其他格式化字符需求可以继续添加，必须转化成字符串
    }
    for (let k in opt) {
      ret = new RegExp('(' + k + ')').exec(fmt)
      if (ret) {
        fmt = fmt.replace(
          ret[1],
          ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')
        )
      }
    }
    return fmt
  }
  // ! css 多类名 初始化 --> 参考shop 页使用
  static cssArrInit = (arr): string => arr.join().replace(',', ' ')
  // ! 深拷贝 ( 对象数组 )
  static deepCopy = (obj: object) => JSON.parse(JSON.stringify(obj))
  // ! 浅拷贝 ( 对象数组 )
  static simpleCopy = (data: any) => {
    if (!data) {
      return ''
    }
    if (Object.prototype.toString.call(data) == '[object Array]') {
      return [...data]
    } else {
      return { ...data }
    }
  }
}
